/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package aprendizajePorRefuerzo.agente;

import aprendizajePorRefuerzo.accion.Accion;
import aprendizajePorRefuerzo.estado.Estado;
import aprendizajePorRefuerzo.reward.Reward;

/**
 *
 * @author Fernando Sorzana
 */
public class AgenteSarsa extends AgenteImp {
    
    private Accion nuevaAccion;
    
    private Accion accionAnterior;

    public Accion getNuevaAccion() {
        return nuevaAccion;
    }

    public void setNuevaAccion(Accion nuevaAccion) {
        this.nuevaAccion = nuevaAccion;
    }

    @Override
    public void aprender(Estado estado, Reward reward) {
        setAccionAnterior(nuevaAccion);
        nuevaAccion = getPolitica().tomarAccion(estado, getFuncionQ(), getAccionesPosibles());
        double qAnterior = getFuncionQ().getValor(getEstadoAnterior(), getAccionAnterior());
        double qNueva = getFuncionQ().getValor(estado, nuevaAccion);
        getFuncionQ().setValor(getEstadoAnterior(), getAccionAnterior(), qAnterior + getAlfa() * (reward.getValor() + getGamma() * qNueva - qAnterior));
    }

    @Override
    public Accion tomarAccion(Estado estado) {
        if (nuevaAccion == null){
            return super.tomarAccion(estado);
        } else {
            setEstadoAnterior(estado);
            return nuevaAccion;
        }
    }

    @Override
    public String toString() {
        return "Agente Sarsa";
    }
    
    
    
}
